package com.briup.day02;

public class Homework3 {
    public static void main(String[] args) {
        /*
         -5 1000 0000(6) 0101 原码
         ==> 1111(7) 1011 补码
         ~进行取反 ==> 0000(7) 0100 补码 4
         最高位为0，即为正数，原码、反码、补码一致
         */
        System.out.println(~-5);
        System.out.println(5 << 2);
        System.out.println(-5 << 2);
        // 有符号右移，负数高位补1，正数补0
        /*
         -5 1000 0000(6) 0101 原码
         ==> 1111(7) 1011 补码
         >> 有符号右移两位 1111(7) 1110 移动后的数据的补码
         ==> 1000 0000(6) 0010 原码 ==> -2
         */
        System.out.println(-5 >> 2); // -2
        // 无符号右移，无论正数还是负数都在高位空缺处补0
        /*
         -5 1000 0000(6) 0101 原码
         ==> 1111(7) 1011 补码
         >> 无符号右移两位 0011 1111(6) 1110 移动后的数据的补码
         ==> 最高位为0，表示正数，0011 1111(6) 1110 原码
         2^30-2
         */
        System.out.println(-5 >>> 2); // 1073741822
        // char类型'a'在ascii码表中的序号为97，而char与int进行运算时，会自动将char提升为int
        // 所以会将 'a' 转换为数值 97，即比较的是 97 == 97 true
        System.out.println(97 == 'a');
        System.out.println(5.0 == 5);
        // 4>5结果为 false 0，'c' > 'a' ==> 99 > 97 ==> true 1
        // 0 ^ 1 = 1 ==> true
        System.out.println(4 > 5 ^ 'c' > 'a');
        /*
         -1 int类型的整数 ==补码==> 1111(8)
         (byte)-1 ==强转后截断前面的内容，只保留最后8位==>  1111 1111 补码
         (char)(byte)-1 ==负数由8位变成16位，高位补1==> 1111(4) 65535
         (int)(char)(byte)-1 ==正数，高位补0==> 0000(4) 1111(4) 65535
         */
        System.out.println((int) (char) (byte) -1); // 65535
    }
}
